{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "378e6e4a",
   "metadata": {},
   "source": [
    "# CharacterTextSplitter\n",
    "\n",
    "이 방법은 가장 간단한 방식입니다.\n",
    "\n",
    "기본적으로 `\"\\n\\n\"` 을 기준으로 문자 단위로 텍스트를 분할하고, 청크의 크기를 문자 수로 측정합니다.\n",
    "\n",
    "1. 텍스트 분할 방식: 단일 문자 기준\n",
    "2. 청크 크기 측정 방식: 문자 수 기준\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0678f139",
   "metadata": {},
   "source": [
    "- `./data/appendix-keywords.txt` 파일을 열어 내용을 읽어들입니다.\n",
    "- 읽어들인 내용을 `file` 변수에 저장합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "60382db1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# data/appendix-keywords.txt 파일을 열어서 f라는 파일 객체를 생성합니다.\n",
    "with open(\"./data/appendix-keywords.txt\") as f:\n",
    "    file = f.read()  # 파일의 내용을 읽어서 file 변수에 저장합니다."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a94fa99e",
   "metadata": {},
   "source": [
    "파일로부터 읽은 파일의 일부 내용을 출력합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "576b7827",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 파일으로부터 읽은 내용을 일부 출력합니다.\n",
    "print(file[:500])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eb193890",
   "metadata": {},
   "source": [
    "# CharacterTextSplitter를 사용하여 분할\n",
    "\n",
    "CharacterTextSplitter를 사용하여 텍스트를 청크(chunk)로 분할하는 코드에 대해 설명합니다.\n",
    "\n",
    "- `separator`: 분할할 기준을 설정합니다. 기본값은 `\"\\n\\n\"`입니다.\n",
    "- `chunk_size`: 각 청크의 최대 크기를 설정합니다. 예: 250자\n",
    "- `chunk_overlap`: 인접한 청크 간 중복을 허용합니다. 예: 50자\n",
    "- `length_function`: 텍스트의 길이를 계산하는 함수를 지정합니다. 예: `len`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4e7426ab",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_text_splitters import CharacterTextSplitter\n",
    "\n",
    "# CharacterTextSplitter를 사용하여 텍스트를 청크(chunk)로 분할하는 코드\n",
    "text_splitter = CharacterTextSplitter(\n",
    "    # 텍스트를 분할할 때 사용할 구분자를 지정합니다. 기본값은 \"\\n\\n\"입니다.\n",
    "    separator=\"\\n\\n\",\n",
    "    # 분할된 텍스트 청크의 최대 크기를 지정합니다 (문자 수).\n",
    "    chunk_size=210,\n",
    "    # 분할된 텍스트 청크 간의 중복되는 문자 수를 지정합니다.\n",
    "    chunk_overlap=0,\n",
    "    # 텍스트의 길이를 계산하는 함수를 지정합니다.\n",
    "    length_function=len,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "676ee781",
   "metadata": {},
   "source": [
    "- `text_splitter`를 사용하여 `file` 텍스트를 문서 단위로 분할합니다.\n",
    "- 분할된 문서 리스트 중 첫 번째 문서(`texts[0]`)를 출력합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9bc6795b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 텍스트를 청크로 분할합니다.\n",
    "texts = text_splitter.create_documents([file])\n",
    "print(len(texts[0].page_content))  # 분할된 문서의 개수를 출력합니다.\n",
    "print(texts[0])  # 분할된 문서 중 첫 번째 문서를 출력합니다."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f8ab954",
   "metadata": {},
   "source": [
    "다음은 문서와 함께 메타데이터를 전달하는 예시입니다.\n",
    "\n",
    "메타데이터가 문서와 함께 분할되는 점에 주목해 주세요.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "efc07efe",
   "metadata": {},
   "source": [
    "- `create_documents` 메서드는 텍스트 데이터와 메타데이터 리스트를 인자로 받습니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dbf68aa3",
   "metadata": {},
   "outputs": [],
   "source": [
    "metadatas = [\n",
    "    {\"document\": 1},\n",
    "    {\"document\": 2},\n",
    "]  # 문서에 대한 메타데이터 리스트를 정의합니다.\n",
    "documents = text_splitter.create_documents(\n",
    "    [\n",
    "        file,\n",
    "        file,\n",
    "    ],  # 분할할 텍스트 데이터를 리스트로 전달합니다.\n",
    "    metadatas=metadatas,  # 각 문서에 해당하는 메타데이터를 전달합니다.\n",
    ")\n",
    "print(documents[0])  # 분할된 문서 중 첫 번째 문서를 출력합니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c2dc9415",
   "metadata": {},
   "outputs": [],
   "source": [
    "len(documents)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6a34727e",
   "metadata": {},
   "outputs": [],
   "source": [
    "documents[1].metadata"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f6ec599",
   "metadata": {},
   "source": [
    "`split_text()` 메서드를 사용하여 텍스트를 분할합니다.\n",
    "\n",
    "- `text_splitter.split_text(file)[0]`은 `file` 텍스트를 `text_splitter`를 사용하여 분할한 후, 분할된 텍스트 조각 중 첫 번째 요소를 반환합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5f72c6c5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# text_splitter를 사용하여 file 텍스트를 분할하고, 분할된 텍스트의 첫 번째 요소를 반환합니다.\n",
    "text_splitter.split_text(file)[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2c3846cd",
   "metadata": {},
   "outputs": [],
   "source": [
    "text_splitter.split_documents([file])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py-test",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
